package com.huaxin.common.message.util;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.text.TextUtils;
import android.widget.Toast;

import com.huaxin.common.tools.Log;
import com.huaxin.common.utils.ToastUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;

/**
 */
public class FileUtil {

    public static void openFile(Context context, File file) {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //设置intent的Action属性
        intent.setAction(Intent.ACTION_VIEW);
        //获取文件file的MIME类型
        String type = getMIMEType(file);
        //设置intent的data和Type属性。
        intent.setDataAndType(/*uri*/Uri.fromFile(file), type);
        //跳转
        try {
            context.startActivity(intent); //这里最好try一下，有可能会报错。 //比如说你的MIME类型是打开邮箱，但是你手机里面没装邮箱客户端，就会报错。
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(context, "文件类型无法打开", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 根据文件后缀名获得对应的MIME类型。
     */
    private static String getMIMEType(File file) {
        String type = "*/*";
        String fName = file.getName();
        //获取后缀名前的分隔符"."在fName中的位置。
        int dotIndex = fName.lastIndexOf(".");
        if (dotIndex < 0) {
            return type;
        }
        /* 获取文件的后缀名*/
        String end = fName.substring(dotIndex, fName.length()).toLowerCase();
        if (TextUtils.isEmpty(end)) return type;
        //在MIME和文件类型的匹配表中找到对应的MIME类型。
        for (String[] mime : MIME_MapTable) { //MIME_MapTable??在这里你一定有疑问，这个MIME_MapTable是什么？
            if (end.equals(mime[0]))
                type = mime[1];
        }
        return type;
    }

    private static final String[][] MIME_MapTable = {
            //{后缀名，MIME类型}
            {".3gp", "video/3gpp"},
            {".apk", "application/vnd.android.package-archive"},
            {".asf", "video/x-ms-asf"},
            {".avi", "video/x-msvideo"},
            {".bin", "application/octet-stream"},
            {".bmp", "image/bmp"},
            {".c", "text/plain"},
            {".class", "application/octet-stream"},
            {".conf", "text/plain"},
            {".cpp", "text/plain"},
            {".doc", "application/msword"},
            {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
            {".xls", "application/vnd.ms-excel"},
            {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
            {".exe", "application/octet-stream"},
            {".gif", "image/gif"},
            {".gtar", "application/x-gtar"},
            {".gz", "application/x-gzip"},
            {".h", "text/plain"},
            {".htm", "text/html"},
            {".html", "text/html"},
            {".jar", "application/java-archive"},
            {".java", "text/plain"},
            {".jpeg", "image/jpeg"},
            {".jpg", "image/jpeg"},
            {".js", "application/x-javascript"},
            {".log", "text/plain"},
            {".m3u", "audio/x-mpegurl"},
            {".m4a", "audio/mp4a-latm"},
            {".m4b", "audio/mp4a-latm"},
            {".m4p", "audio/mp4a-latm"},
            {".m4u", "video/vnd.mpegurl"},
            {".m4v", "video/x-m4v"},
            {".mov", "video/quicktime"},
            {".mp2", "audio/x-mpeg"},
            {".mp3", "audio/x-mpeg"},
            {".mp4", "video/mp4"},
            {".mpc", "application/vnd.mpohun.certificate"},
            {".mpe", "video/mpeg"},
            {".mpeg", "video/mpeg"},
            {".mpg", "video/mpeg"},
            {".mpg4", "video/mp4"},
            {".mpga", "audio/mpeg"},
            {".msg", "application/vnd.ms-outlook"},
            {".ogg", "audio/ogg"},
            {".pdf", "application/pdf"},
            {".png", "image/png"},
            {".pps", "application/vnd.ms-powerpoint"},
            {".ppt", "application/vnd.ms-powerpoint"},
            {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
            {".prop", "text/plain"},
            {".rc", "text/plain"},
            {".rmvb", "audio/x-pn-realaudio"},
            {".rtf", "application/rtf"},
            {".sh", "text/plain"},
            {".tar", "application/x-tar"},
            {".tgz", "application/x-compressed"},
            {".txt", "text/plain"},
            {".wav", "audio/x-wav"},
            {".wma", "audio/x-ms-wma"},
            {".wmv", "audio/x-ms-wmv"},
            {".wps", "application/vnd.ms-works"},
            {".xml", "text/plain"},
            {".z", "application/x-compress"},
            {".zip", "application/x-zip-compressed"},
            {"", "*/*"}
    };

    /**
     * 获取拓展存储Cache的绝对路径
     */
    public static String getExternalCacheDir(Context context) {
//        if (!isMounted())
//            return null;
        StringBuilder sb = new StringBuilder();
        File file = context.getExternalCacheDir();
        // In some case, even the sd card is mounted,
        // getExternalCacheDir will return null
        // may be it is nearly full.
        if (file != null) {
            sb.append(file.getAbsolutePath());
        } else {
            sb.append(Environment.getExternalStorageDirectory().getPath()).append("/Android/data/").append(context.getPackageName())
                    .append("/cache/");
        }
        return sb.toString();
    }

    /**
     * 获取缓存的默认svg效果图
     */
    public static String getLocalSvgUrl(Context context, String key) {
        final String parent = getExternalCacheDir(context) + "/chat/";
        if (!new File(parent).exists()) {
            if (!new File(parent).mkdirs()) {
                Log.d("create Dir " + parent + " failed!");
            }
        }
        return parent + key + ".png";
    }

    /**
     * 获取缓存的自定义img效果图
     */
    public static String getCacheImgUrl(Context context, String key) {
        final String parent = getExternalCacheDir(context) + "/chat/img/";
        if (!new File(parent).exists()) {
            if (!new File(parent).mkdirs()) {
                Log.d("create Dir " + parent + " failed!");
            }
        }
        return parent + key + ".png";
    }

    /**
     * 获取缓存的自定义svg效果图
     */
    public static String getCacheSvgUrl(Context context, String key) {
        final String parent = getExternalCacheDir(context) + "/chat/svg/";
        if (!new File(parent).exists()) {
            if (!new File(parent).mkdirs()) {
                Log.d("create Dir " + parent + " failed!");
            }
        }
        return parent + key + ".png";
    }

    /**
     */
    public static String getCacheDataItemUrl(Context context, String key) {
        final String parent = getExternalCacheDir(context) + "/chat/dataitem/";
        if (!new File(parent).exists()) {
            if (!new File(parent).mkdirs()) {
                Log.d("create Dir " + parent + " failed!");
            }
        }
        return parent + key + ".png";
    }

    /**
     * 获取缓存的默认svg效果图
     */
    public static String getLocalDeviceUrl(Context context, String key) {
        final String parent = getExternalCacheDir(context) + "/chat/";
        if (!new File(parent).exists()) {
            if (!new File(parent).mkdirs()) {
                Log.d("create Dir " + parent + " failed!");
            }
        }
        return parent + key + ".png";
    }

    /**
     * 获取缓存的自定义device效果图
     */
    public static String getCacheDeviceUrl(Context context, String key) {
        final String parent = getExternalCacheDir(context) + "/chat/device/";
        if (!new File(parent).exists()) {
            if (!new File(parent).mkdirs()) {
                Log.d("create Dir " + parent + " failed!");
            }
        }
        return parent + key + ".png";
    }

    /**
     * 选择文件
     */
    public static void selectFileFromLocal(Activity activity, int ret) {
        final Intent intent;
        try {
//            if (Build.VERSION.SDK_INT < 19) {
                intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("*/*");
                intent.addCategory(Intent.CATEGORY_OPENABLE);
//            } else {
//                intent = new Intent(
//                        Intent.ACTION_PICK,
//                        MediaStore.Files.getContentUri("external"));
//            }
            activity.startActivityForResult(intent, ret);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();
            ToastUtil.showToast("找不到文件管理器");
        }

    }

    /**
     * 复制单个文件
     *
     * @param oldPath String 原文件路径 如：c:/fqf.txt
     * @param newPath String 复制后路径 如：f:/fqf.txt
     * @return boolean
     */
    public static void copyFile(String oldPath, String newPath) {
        try {
            int bytesum = 0;
            int byteread = 0;
            File oldfile = new File(oldPath);
            File newfile = new File(newPath);
            if (newfile.exists()) {
                newfile.deleteOnExit();
            }
            newfile.createNewFile();
            if (oldfile.exists()) {
                InputStream inStream = new FileInputStream(oldPath); //读入原文件
                FileOutputStream fs = new FileOutputStream(newPath);
                byte[] buffer = new byte[1444];
//                int length;
                while ((byteread = inStream.read(buffer)) != -1) {
                    bytesum += byteread; //字节数 文件大小
//                    System.out.println(bytesum);
                    fs.write(buffer, 0, byteread);
                }
                inStream.close();
                fs.flush();
                fs.close();
            }
        } catch (Exception e) {
            System.out.println("复制单个文件操作出错");
            e.printStackTrace();
        }

    }
}
